package com.dpiinc.TechPage

import android.text.TextUtils
import android.util.Log
import org.json.JSONArray
import org.json.JSONException
import org.json.JSONObject


/**
 * Log
 * Created by X on 2018/7/2.
 */
object AWLog {
    private const val DEFAULT_TAG = "TechPage+"

    private var isDebug: Boolean = false

    @JvmStatic
    fun init(isDebug: Boolean) {
        AWLog.isDebug = isDebug
    }

    @JvmStatic
    fun v(msg: String) {
        if (isDebug) {
            Log.v(generateTag(), msg)
        }
    }

    @JvmStatic
    fun d(msg: String) {
        if (isDebug) {
            Log.d(generateTag(), msg)
        }
    }

    @JvmStatic
    fun i(msg: String) {
        if (isDebug) {
            Log.i(generateTag(), msg)
        }
    }

    @JvmStatic
    fun w(msg: String) {
        if (isDebug) {
            Log.w(generateTag(), msg)
        }
    }

    @JvmStatic
    fun e(msg: String) {
        if (isDebug) {
            Log.e(generateTag(), msg)
        }
    }

    @JvmStatic
    fun wtf(msg: String) {
        if (isDebug) {
            Log.wtf(generateTag(), msg)
        }
    }

    @JvmStatic
    fun v(tag: String, msg: String) {
        if (isDebug) {
            Log.v(tag, msg)
        }
    }

    @JvmStatic
    fun d(tag: String, msg: String) {
        if (isDebug) {
            Log.d(tag, msg)
        }
    }

    @JvmStatic
    fun i(tag: String, msg: String) {
        if (isDebug) {
            Log.i(tag, msg)
        }
    }

    @JvmStatic
    fun w(tag: String, msg: String) {
        if (isDebug) {
            Log.w(tag, msg)
        }
    }

    @JvmStatic
    fun e(tag: String, msg: String) {
        if (isDebug) {
            Log.e(tag, msg)
        }
    }

    @JvmStatic
    fun wtf(tag: String, msg: String) {
        if (isDebug) {
            Log.wtf(tag, msg)
        }
    }

    private val LINE_SEPARATOR = System.getProperty("line.separator")

    fun printJson(msg: String) {
        printJson(null, msg)
    }

    fun printJson(tag: String?, msg: String) {
        val message = try {
            when {
                msg.startsWith("{") -> {
                    val jsonObject = JSONObject(msg)
                    jsonObject.toString(4)//返回格式化的json字符串，其中的数字4是缩进字符数
                }
                msg.startsWith("[") -> {
                    val jsonArray = JSONArray(msg)
                    jsonArray.toString(4)
                }
                else -> msg
            }
        } catch (e: JSONException) {
            msg
        }
        val lines = message.split(LINE_SEPARATOR!!.toRegex()).dropWhile { it.isEmpty() }
        for (line in lines) {
            if (tag.isNullOrEmpty()){
                d(line)
            } else {
                d(tag!!, line)
            }
        }
    }

    private fun generateTag(): String {
        val caller = Thread.currentThread().stackTrace[4]
        var tag = "%s.%s()"
        try {
            var callerClazzName = caller.className
            callerClazzName = callerClazzName.substring(callerClazzName.lastIndexOf(".") + 1)
            tag = String.format(tag, callerClazzName, caller.methodName)
        } catch (e: IndexOutOfBoundsException) {
            return DEFAULT_TAG
        }

        return if (TextUtils.isEmpty(DEFAULT_TAG)) tag else "$DEFAULT_TAG,$tag"
    }
}